package a_12届蓝桥真题;

import java.util.Arrays;

/*
在平面直角坐标系中，两点可以确定一条直线。如果有多点在- -条直线上，
那么这些点中任意两点确定的直线是同- -条。
给定平面上2x3个整点{(x,y)l0≤x<2,0≤y<3,x∈Z,y∈Z}，即横坐标
是0到1 (包含0和1)之间的整数、纵坐标是0到2(包含0和2)之间的整数
的点。这些点一-共确定了11条不同的直线。
给定平面上20x21个整点{(x,y)l0≤x<20,0≤y<21,x∈Z,y∈Z}，即横
坐标是0到19(包含0和19)之间的整数、纵坐标是0到20(包含0和20)之
间的整数的点。请问这些点一共确定了多少条不同的直线。

40257
 */
public class c直线 {
	public static void main(String[] args) {
		c直线 test = new c直线();
		test.useDeal();
	}
	
	public void useDeal() {
		int N = 200000;
		Line[] lines = new Line[N];
		int res = deal(lines);
		System.out.println(res);
	}
	
	public int deal(Line[] lines) {
		int current = 0;
		for (int x1 = 0; x1 < 20; x1++) {
			for (int y1 = 0; y1 < 21; y1++) {
				for (int x2 = 0; x2 < 20; x2++) {
					for (int y2 = 0; y2 < 21; y2++) {
						if (x1 != x2) {
							double k =  ((double) (y2 - y1) / (double) (x2 - x1));
							double b = ((double) (x2 * y1 - x1 * y2) / (double) (x2 - x1));
							lines[current] = new Line(k, b);
							current++;//最后一个k,b填完后，current也会++，导致current比最后一个元素的索引大1
						}
					}
				}
			}
		}
		Line[] helper = new Line[current];
		for (int i = 0; i < current; i++) {
			helper[i] = lines[i];
		}
		Arrays.sort(helper);
		int res = 0;
		for (int i = 0; i < current; i++) {
			boolean flag = true;
			for (int j = i + 1; j < current; j++) {//j = i + 1;意思是当前的k不用和比自己小的k相比
				if (Math.abs(lines[j].k - lines[i].k) <= 1e-8 && Math.abs(lines[j].b - lines[i].b) <= 1e-8) {//必须用到取绝对值方法
					flag = false;
					break;
				}
			}
			if (flag) {
				res++;
			}
		}
		return res + 20;//斜率不存在，就是x1=x2，四重for循环中我们没考虑这20种情况，这里加上
	}
	
	private static class Line implements Comparable<Line> {
		double k;
		double b;
		public Line(double k, double b) {
			this.k = k;
			this.b = b;
		}
		@Override
		public int compareTo(Line o) {
			int x = (int) ((this.k - o.k) * 1e8);
			if (x == 0) {
				return  (int) ((this.b - o.b) * 1e8);
			}
			return x;
		}
		@Override
		public String toString() {
			// TODO Auto-generated method stub
			return "k = " + (double)k + " b = " + (double)b;
		}
	}
}
